package com.neu.table;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

import com.neu.pojo.Model;
import com.neu.pojo.Problem;
import com.neu.service.ImodelService;
import com.neu.service.IreflectService;
import com.neu.service.impl.ModelService;
import com.neu.service.impl.ReflectService;

public class ModelShowTable extends AbstractTableModel{//展示模板中问题的表格
	private String[] colNames = {"","问题ID","题目"};//表头
	private Object[][] data;//数据
	
	//会用到的service
	private ImodelService modelService = ModelService.getInstance();
	private	IreflectService reflectService = ReflectService.getInstance();
	
	//构造
	public ModelShowTable(Model m) {
		ArrayList<Problem> problems = modelService.getProblems(m);//得到模板关联的所有问题
		
		System.out.println(problems);//控制台输出看一下
		if(problems!=null&&problems.size()>0) {//不是空
			data = new Object[problems.size()][colNames.length];//实例化二维数组
			
			for(int i=0;i<problems.size();i++) {//遍历集合，加载数据
				data[i][0] = new Boolean(false);//复选框
				data[i][1] = problems.get(i).getId();//问题id
				data[i][2] = problems.get(i).getProblem();//题目
			}
		}else {
			this.data = new Object[0][0];
		}
	}
	
	//返回结果行数
	@Override
	public int getRowCount() {
		return this.data.length;
	}

	//返回结果列数
	@Override
	public int getColumnCount() {
		return this.colNames.length;
	}
	
	//获得对应列名
	@Override
	public String getColumnName(int column) {
		return this.colNames[column];
	}

	//每列对应的类型
	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return data[0][columnIndex].getClass();
	}
	
	//返回哪行哪列对应的数据
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		return data[rowIndex][columnIndex];
	}
	
	/**
	 * 哪列不能编辑
	 * 返回false 不可编辑
	 */
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		if(columnIndex == 1) {//id不可修改
			return false;
		}else {
			return true;
		}
	}
	
	//修改表格中的数据
	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		data[rowIndex][columnIndex] = aValue;
		/*修改表格数据后，显示改后结果*/
		fireTableCellUpdated(rowIndex, columnIndex);
	}

	@Override
	public void fireTableRowsDeleted(int firstRow, int lastRow) {
		super.fireTableRowsDeleted(firstRow, lastRow);
	}	
	
	//删除
	public int delete(Model m){//删除模板中的问题（删除关系）
		int cnt=0;//删除的个数
		for (int i=0;i<getRowCount();i++) {
			if ((boolean)data[i][0]) {
				//模板删除问题，只动reflect
				System.out.println(reflectService.delete(m , new Problem((int)getValueAt(i, 1))));
				cnt+=1;
			}
        }
		if(cnt == 0) {
			return 0;
		}
		
		//文件中数据已经更改
        fireTableDataChanged();
	    Object[][] data2=new Object[getRowCount()-cnt][colNames.length];//创建减少了cnt行的数据数组
	    int j=0;
	    for (int i=0;i<getRowCount();i++) {//将未选中的数据保留，选中的丢弃
			if (getValueAt(i,0).equals(false)) {//如果没选中
				data2[j][0]=new Boolean(false);
				data2[j][1]=data[i][1];
				data2[j][2]=data[i][2];
				j++;
			}	
		}
	    data=new Object[getRowCount()-cnt][colNames.length];//new 新数组
	    data=data2;//覆盖原来的data
	    return cnt;//返回删除的个数
	}	
	
}
